package array;

/**
 * @author : niu niu
 * @version : 1.0.0
 * @date : 2022/8/23 21:41
 * JVM内存区域划分和引用数据类型
 *          JVM在使用内存时，什么类型的数据放在什么区域，都是规定好的，不能随意存储，分类进行存储和读取
 *          JVM将内存分为5大区域，这里着重研究 栈区 和 堆区
 * 栈中存储调用方法中的局部变量，形参。java中每个方法的调用就是一个栈帧入栈和出栈的过程
 *
 * 堆中 ，在java中使用关键字new 产生的所有对象都在堆中存储
 */
public class StackDemo {
    public static void main(String[] args) {
//        int x =10;
//        int y =20;
//        swap(x,y);
//        System.out.println("main方法中的x = " + x + ", y = " + y);
//        int[] arr = new int[]{10,20};
        //在堆上产生一个数组对象，内部保存了 两个元素 10 ，20
        //在栈上开辟了一个引用类型 arr保存了堆中数组首地址的值
//        swapArr(arr);
//        System.out.println("arr[0] = " + arr[0] + ", arr[1] = " + arr[1]);
        int n = 5;
        int[] ret = fiboN(n);
        // 不指向任何的堆内存地址
        ret = null;
        //NullPointerException
        System.out.println(ret.length);
    }


    public static int[] fiboN(int n) {
        if (n < 0 ) {
            // null - 空指针(空引用)，引用数据类型的默认值,当引用类型保存的值是null时
            // 说明该引用没有保存任何的堆内存地址。
            return null;
        }
        int[] arr = new int[n];
        arr[0] = arr[1] = 1;
        // 一定记住，数组下标和元素个数差一个单位
        for (int i = 2; i < n; i++) {
            // 状态转移方程
            arr[i] = arr[i - 1] + arr[i - 2];
        }
        return arr;
    }
    public static void swapArr(int[] arr){
        int tem = arr[0];
        arr[0]=arr[1];
        arr[1]=tem;
    }
    public static void swap(int x,int y){
        int tem = x;
        x=y;
        y=tem;
        System.out.println("swap方法中的x = " + x + ", y = " + y);
    }
}
